#include "../header.h"

//1.创建一个信号量
//2.初始化信号量
//3.p操作
//4.稀缺资源文件操作--
//5.v操作
//6.销毁信号量
union semnum
{
    int value;
};
//定义变量 = 1  ; 
union  semnum value = {1};

int main(int argc, char const *argv[])
{
    //路径数值 + 50 -> 合成一个唯一数值
    key_t key = ftok(".",60);
    if(key < 0)
    {
        perror("键值生成失败!\n");
        return -1;
    }
    printf("键值生成成功:%d\n",key);

    //生成信号量
    //创建一个信号量 指定访问权限
    int semid = semget(key,1,IPC_CREAT|0600);
    if(semid < 0)
    {
        perror("semid error\n");
        return -2;
    }
    //打印信号量id值
    printf("semid = %d\n",semid);
    
    //初始化信号量
    semctl(semid,0,SETVAL,value);
    //获取信号量初值
    int res = semctl(semid,0,GETVAL,0);
    printf("返回值就是信号量初值:%d\n",res);

    //p操作
    struct sembuf buf = {0};
    buf.sem_num = 0 ; 
    buf.sem_flg = 0 ;
    //p操作 
    buf.sem_op = -1;
    if(semop(semid,&buf,1) < 0 )
    {
        perror("p操作失败!\n");
    }
    //再次获取value 的数值
    res = semctl(semid,0,GETVAL,0);
    printf("p操作以后的信号量数值是:%d\n",res);
    //操作临界数据
    printf("操作临界数据的代表一句话!\n");

    buf.sem_op = +1;
    if(semop(semid,&buf,1) < 0 )
    {
        perror("v操作失败!\n");
    }
    //再次获取value 的数值
    res = semctl(semid,0,GETVAL,0);
    printf("v操作以后的信号量数值是:%d\n",res);

    //删除信号量
    semctl(semid,0,IPC_RMID,0);
    //查看是否还有信号量。
    system("ipcs -s");

    return 0;
}
